1章 プロンプトの5つの原則
from 生成AIのプロンプトエンジニアリング
プロンプトの5つの原則の概要
以下の5つの原則はプロンプトに限らず、すべての仕事をする際にも有用
LLM だけでなく画像生成モデルに利用できる
2022/7にでた Prompt Engineering: From Words to Art and Copy やOpenAIの Prompt Engineering Guide とも一致して、時間がたっても風化しなかった原則
1. 方向性を示す
2. 出力形式を指定する
3. 例を示す
4. 品質を評価する
5. タスクを分割する
1. 方向性を示す
望ましいスタイルを詳細に説明するか、関連する人物を引き合いに出す
手法
プロンプトの中で役割を与えたり、実際にモデルにした人物名などを入れる(ロールプロンプティング)
画像生成AIでは非常に有効(ゴッホという言葉などを入れるとそれっぽい画像が出来上がる)
ルールやベストプラクティスをプロンプトに入れてAIを誘導する(プリウォーミング・内部検索)
始めにAIにベストプラクティスを聞いて、そのあとに同じコンテキストを使って達成したいタスクを依頼する
達成したいタスクに対して、有益な記事などをコンテキストとして含めること
方向性が多すぎたり具体的すぎると、学習データ内部で全ての方向性に一致するデータが見つけられず、意図しないレスポンスを生み出すことがある。この場合は、どの要素が優先度が高いかを選択してプロンプトに組み込む必要がある
2. 出力形式を指定する
通常のプロンプトであれば問題ないが、アプリケーションに組み込むプロンプトの場合は出力形式を指定して対応する
JSONやYAMLは一般的な形式
仮に不完全なJSONを返した場合は、プログラミング言語のJSON解析関数を使ってチェックし、再度AIに修正依頼をする
「あなたはJSONだけで応答する有用なアシスタントです」と記載するとJSONの精度も高くなる
「方向性を示す」と「出力形式を指定する」はときに衝突する。方向性はプロンプトのスタイルに集中し、出力形式は出力結果の型にだけ集中すること。重複する要素がある場合は、優先順位の低い要素を削除することを勧める
3. 例を示す
プロンプトの中に「サンプル:{}」 な項目を使って実現する
何も例を示さないプロンプト(ゼロショット)と複数例を提示したプロンプト(ヒューショット)を比較した論文があり、一つ例を追加することで、 タスクの精度が10% ~ 50%まで上がったという研究結果がある
Language Models are Few-Shot Learners
例を示すことで、AIに情報の良し悪しを判断することができ、専門的な知識がない場合に最も効果的
しかし一方、例を示すことは信頼性と創造性のトレードオフが発生する
例が複数ある場合:信頼性は高くなるが、創造性が低くなる
例がない場合:創造性は高くなるが、信頼性は低くなる
そのため、1つから3つまでの例は有用であるが、4つ以上含めるときには、それらの例に類似性があるかを研究する必要がある
一部の研究では、「例を示す」より「方向性を示す」の方が効果的だと言われている研究結果もある
Tool Documentation Enables Zero-Shot Tool-Usage with Large Language Models
例を含めるときには、有益な例を示す必要があるため、まずは「方向性を示す」を試みることが原則
4. 品質を評価する
品質を評価するライブラリは複数あり、オープンソースされているものもあるので、こちらも有用
Open AI Evals / RAGAS
評価する例として、複数のプロンプト応答に対して「高評価」「低評価」をして評価をする方法で判断する方法がある。これだけでも品質の一定の厳密さを保つことができる
プロンプトを評価する観点と対応内容の一例が以下
費用の削減:多くのトークンを使用するプロンプトや、高価なモデルでしか回答できないプロンプトが本番環境において実用的であるか
遅延の対策:遅延によりユーザー体験を悪くさせていないか
呼び出し回数の削減:ループ処理によるAI問い合わせ回数を削減できないか
性能の改善:外部フィードバックシステムを実装する
分類の精度向上:作成したプロンプトに対して、評価を意味するラベル(Good / Bad)を発行して調査する方法
推論の精度向上:参考事例と比較して、どのような時に推論が適用できないか、計算されないかを検証する
ハルシネーションの回避:コンテキストにない言葉の組み合わせがどのくらい発生しているのかを調査
安全性の確保:システムが安全でない、望ましい結果がでない場面を測定する
誤検知の削減:ユーザーの要求を誤って拒否しないために、禁止用語に印をつけ調査する
サイバー攻撃の対策:プロンプトインジェクションの対策
類似性の評価:生成されたテキストと参照されたテキストで出てきた言葉に類似性があるかをフレーズ(ROUGE)・ベクトル距離などを使用して測定する
プロンプトに含める例のどれが良かったかがわかると、例の更新が簡単にでき、システムを継続的に使用するプロンプトとして活用できる。
一つの応答だけでジャッジするのではなく、複数の応答を並べて比較することで、相対的な性能を判断することも可能
画像の生成の場合は基本、複数の方向や出力形式を準備し、それぞれの組み合わせで性能をチェックするパーミューテーションプロンプティングという形をとる
5. タスクを分割する
タスクを分解して問題を構成要素として分割して解決すること。個々の結果を簡単に解決し、その結果を再結合する手法。
連鎖させることで、複雑なタスクを達成したり、どこで失敗したかを確認することができる。
LLMは応答の文を作ることで精一杯で、文脈を読み取ることが困難。なので、タスクを分けて前後の文脈を取得することができれば、応答の精度を向上させることができる。
タスクを分解する時には「段階的に考えましょう」とプロンプトに入れるだけ
これはChain Of Thought Reasoningと呼ばれる手法である
より複雑な目標を達成するために、複数の生成AIモデルの連携を行うのが一般的
データベースのデータや他の生成AIの呼び出しによって動的に作成されるプロンプトなどもある
複数のプロンプトを使って精度の高い応答を引き出すことをプロンプトチェーンという、AIエージェントでよく用いている手法。
各モデルの違い
OpenAI / Gemeni / Claude それぞれが提供しているプロンプトのベストプラクティスを公開している。それぞれ共通なもの手法もあるが、特徴もそれぞれあるのでまとめていく
共通なプラクティス
明確な具体例を示すこと。どのモデルもfew-shotプロンプトを推奨している
Chain Of Thought Reasoning
大きなタスクを小さいタスクに分解して、複雑なタスクを分割する
AIエージェント
table:_
観点 Claude OpenAI Gemini
フレームワーク テクニック別 6戦略体系 一般原則+モデル別ガイド
構造化手法 XMLタグを最重視 デリミタ(###, """) XMLまたはMarkdown(一貫して使用)
パラメータ調整 あまり言及なし temperature中心に解説 topK/topP/temperatureを詳細に解説
独自テクニック プレフィル、XMLタグ、ロール付与 参考テキスト戦略、体系的テスト ポジティブパターン強調、否定制約の配置